#pragma once

#include "iostream"
#include "vector"
#include "algorithm"

using namespace std;
/*HJJ QQ479287006
 *给你一个整数数组 nums ，找到其中最长严格递增子序列的长度。

子序列 是由数组派生而来的序列，删除（或不删除）数组中的元素而不改变其余元素的顺序。例如，[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

 
示例 1：

输入：nums = [10,9,2,5,3,7,101,18]
输出：4
解释：最长递增子序列是 [2,3,7,101]，因此长度为 4 。
示例 2：

输入：nums = [0,1,0,3,2,3]
输出：4
示例 3：

输入：nums = [7,7,7,7,7,7,7]
输出：1

来源：力扣（LeetCode）
链接：https://leetcode.cn/problems/longest-increasing-subsequence
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * */
//要明确dp[i]代表的内容
//dp[i] 代表从0 到当前位置的num[i] 递增子序列长度
int lengthOfLIS(vector<int> &nums) {

    vector<int> dp(nums.size(), 1);//这里要初始化为1 确实要初始化为1
    int maxv = 0;
    if (nums.size() <= 1)
        return nums.size();

    for (int i = 1; i < nums.size(); ++i) {

        for (int j = 0; j < i; ++j) {
// 这里一定要是i 循环和j 作比较  所以要 nums[i] >nums[j]
            if (nums[i]>nums[j])
           dp[i]= max(dp[j]+1,dp[i]) ;
        }

        maxv = max(maxv, dp[i]);

    }


    return maxv;

}

//暴力出错 卡用例
int lengthOfLIS1(vector<int> &nums) {
    int result = 0;


    for (int i = 0; i < nums.size(); i++) {
        int temp = 1;
        int pre = nums[i];
        for (int j = i + 1; j < nums.size(); j++) {
            if (nums[j] > pre) {
                temp++;
                pre = nums[j];
            }

            result = max(result, temp);
        }
        temp = 1;

    }


    return result;
}